package com.javase.algorithm.leetcode;

import com.javase.algorithm.leetcode.utils.ListNode;

import java.util.Arrays;

/**
 * @author liyanhao
 * @Date 2022-09-21 15:08
 * <p>
 * 输入：l1 = [2,4,3], l2 = [5,6,4]
 * 输出：[7,0,8]
 * 解释：342 + 465 = 807.
 */
public class LC02 {
    public static void main(String[] args) {
        LC02 lc02 = new LC02();
        ListNode l1 = new ListNode();
        l1.val = 2;
        ListNode listNode1 = new ListNode();
        listNode1.val = 4;
        l1.next = listNode1;
        ListNode listNode2 = new ListNode();
        listNode2.val = 3;
        listNode1.next = listNode2;


        ListNode l2 = new ListNode();
        l2.val = 5;
        l2.next = new ListNode();
        l2.next.val = 6;
        l2.next.next = new ListNode();
        l2.next.next.val = 4;

        ListNode listNode = lc02.addTwoNumbers(l1, l2);
        System.out.println(listNode);
    }


    /**
     * 思路与算法
     * <p>
     * 由于输入的两个链表都是逆序存储数字的位数的，因此两个链表中同一位置的数字可以直接相加。
     * <p>
     * 我们同时遍历两个链表，逐位计算它们的和，并与当前位置的进位值相加。具体而言，如果当前两个链表处相应位置的数字为 n1,n2，进位值为 carry，则它们的和为 n1+n2+carry；其中，答案链表处相应位置的数字为 (n1+n2+carry)mod10，而新的进位值为 ⌊
     * 10
     * n1+n2+carry
     * <p>
     * 如果两个链表的长度不同，则可以认为长度短的链表的后面有若干个 0 。
     * <p>
     * 此外，如果链表遍历结束后，有 carry>0，还需要在答案链表的后面附加一个节点，节点的值为 carry。
     *
     * @param l1
     * @param l2
     * @return
     */
    public ListNode addTwoNumbers01(ListNode l1, ListNode l2) {
        ListNode head = null, tail = null;
        int carry = 0;
        while (l1 != null || l2 != null) {
            int n1 = l1 != null ? l1.val : 0;
            int n2 = l2 != null ? l2.val : 0;
            int sum = n1 + n2 + carry;
            if (head == null) {
                head = tail = new ListNode(sum % 10);
            }else {
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }

            carry = sum/10;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            tail.next = new ListNode(carry);
        }
        return head;
    }

    /**
     * 1.暴力法
     *
     * @param l1
     * @param l2
     * @return
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        StringBuffer sb1 = new StringBuffer();
        StringBuffer sb2 = new StringBuffer();

        ListNode next1 = l1.next;
        sb1.append(l1.val);
        while (next1 != null) {
            sb1.append(next1.val);
            next1 = next1.next;
        }

        ListNode next2 = l2.next;
        sb2.append(l2.val);
        while (next2 != null) {
            sb2.append(next2.val);
            next2 = next2.next;
        }

        Integer integer1 = Integer.valueOf(sb1.toString());
        Integer integer2 = Integer.valueOf(sb2.toString());
        int i = integer1 + integer2;
        String s = String.valueOf(i);
        String[] split = s.split("");
        ListNode listNode1 = new ListNode();
        ListNode listNode = new ListNode();
        listNode1.next = listNode;
        ListNode tmpNode = null;

        System.out.println(Arrays.toString(split));
        for (int j = split.length - 1; j >= 0; j--) {
            System.out.println(split[j]);
            tmpNode = new ListNode();
            tmpNode.val = Integer.valueOf(split[j]);
            listNode.next = tmpNode;
            listNode = tmpNode;
        }
        return listNode1.next.next;
    }

}